/**
 * 1. Promist是一个类, 在执行这个类的时候, 需要传递一个执行器进去, 执行器会立即执行
 * 2. Promise中有三种状态,等待：padding 成功：fulfilled 失败：rejected
 * 状态只能从等待变成成功或者失败 padding -> fulfilled || padding -> rejected
 * 一旦状态发生改变，就不可能再更改了
 * 3. resolve 和 reject 是用来将Promist的状态改变的
 * resolve: fulfilled
 * reject: rejected
 * 4. then方法内部要判断当前的状态，如果当前状态为成功则调用成功回调，如果状态为失败则调用失败回调，then方法是定义在原型对象上的
 * 5. then成功回调有一个参数，参数为成功的值 失败回调有一个参数，参数为失败的原因
 * 6. 同一个promise对象下的then方法是可以多次调用的
 * 7. then方法是可以进行链式调用的，后面的then方法拿到的是上一个then方法的回调函数
 */

const MyPromise = require('./myPromise')

// let promise = new MyPromise((resolve, reject) => {
//   resolve('成功')
//   reject('失败')
// }).then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason)
// })

// 异步情况
// let promise = new MyPromise((resolve, reject) => {
//   setTimeout(() => {
//     resolve('成功')
//     reject('失败')
//   }, 3000)
// }).then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason)
// })

// 返回值为Promise和普通值的情况
// function returnPromise () {
//   return new MyPromise((resolve, reject) => {
//     resolve('inner-成功')
//   })
// }

// let promise = new MyPromise((resolve, reject) => {
//   resolve('成功')
// })

// promise.then(value => {
//   console.log(value)
//   return returnPromise()
// }).then(value => {
//   console.log(value)
//   return 100
// }).then(value => {
//   console.log(value)
// })

// 解决promise的then返回自己时的报错
// let promise = new MyPromise((resolve, reject) => {
//   resolve('成功')
// })

// let p1 = promise.then(value => {
//   console.log(value)
//   return p1
// })

// p1.then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason.message)
// })

// 捕获函数执行报错，并输出
// let promise = new MyPromise((resolve, reject) => {
//   throw new Error('失败了')
// })

// promise.then(value => console.log(value), reason => console.log(reason.message))
// let promise = new MyPromise((resolve, reject) => {
//   resolve('成功')
// })

// promise.then(value => {
//   throw new Error('成功回调执行错误了')
// }).then(value => console.log(value), reason => console.log(reason.message))

// let promise = new MyPromise((resolve, reject) => {
//   reject('失败')
// })

// promise.then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason)
//   return 100
// }).then(value => console.log(value), reason => console.log(reason.message))

// 解决then的参数选填以及value值的传递
// let promise = new MyPromise((resolve, reject) => {
//   resolve('成功')
//   // reject('失败')
// })

// promise.then().then().then(value => { console.log(value) })

// promise.all功能实现
// function p1 () {
//   return new MyPromise((resolve, reject) => {
//     setTimeout(() => {
//       resolve('p1')
//     }, 2000)
//   })
// }

// function p2 () {
//   return new MyPromise((resolve, reject) => {
//     resolve('p2')
//   })
// }

// MyPromise.all(['a', 'b', p1(), p2(), 'c']).then(value => console.log(value))

// promise.resolve方法的实现
// function p1 () {
//   return new MyPromise((resolve, reject) => {
//     setTimeout(() => {
//       resolve('p1')
//     }, 2000)
//   })
// }

// MyPromise.resolve(100).then(console.log)
// MyPromise.resolve(p1()).then(console.log)

// promise.finally方法的实现
// function p1 () {
//   return new MyPromise((resolve, reject) => {
//     setTimeout(() => {
//       resolve('p1')
//     }, 2000)
//   })
// }

// function p2 () {
//   return new MyPromise((resolve, reject) => {
//     resolve('p2 resolve')
//     // reject('p2 reject')
//   })
// }
// p2().finally(result => {
//   console.log('finally', result)
//   return p1()
// }).then(console.log, console.log)

// promise.catch方法的实现
function p2 () {
  return new MyPromise((resolve, reject) => {
    // resolve('p2 resolve')
    reject('p2 reject')
  })
}

p2().then(console.log).catch(console.log)